home *** CD-ROM | disk | FTP | other *** search
/ Aminet 23 / Aminet 23 (1998)(GTI - Schatztruhe)[!][Feb 1998].iso / Aminet / text / misc / micronote.lha / オNote / Source / オNote.c < prev   
C/C++ Source or Header  |  1996-12-27  |  10KB  |  386 lines

  1. // µNote 1.1
  2. // © 1996 by Daniel Hirscher
  3. /// informaton
  4. // -------------------------------------------------------------------------
  5. //
  6. // Projekt           :  µNote
  7. //
  8. // Dateiname         :  µNote
  9. //
  10. // Sprache/Compiler  :  C, MaxonC 3.1
  11. //
  12. // Betriebssystem    :  AmigaOS 3.1
  13. //
  14. // Kurzbeschreibung  :  kleines Programm um kleine Notizen zu machen
  15. //
  16. // zugehörige Dateien:  µNote.guide
  17. //                      µNote.c
  18. //
  19. // Ersteller         :  Daniel Hirscher
  20. //
  21. // Datum             :  17.12.96 bis 27.12.96
  22. //
  23. // Version           :  siehe setapp();
  24. //
  25. // -------------------------------------------------------------------------
  26. ///
  27.  
  28. #define DEBUG
  29.  
  30. /// include
  31. #include <my.h>
  32.  
  33. #include <exec/memory.h>
  34. #include <clib/iffparse_protos.h>
  35. #include <libraries/iffparse.h>
  36. #include <pragma/iffparse_lib.h>
  37. #include <gadgets/textfield.h>
  38. #include <proto/textfield.h>
  39. #include <intuition/icclass.h>
  40. #include <intuition/gadgetclass.h>
  41. #include "Note_cat.h"
  42. ///
  43. /// define
  44. #ifdef DEBUG
  45. #define NOTEFILE "ram:µNotes.data"
  46. #define NOTEBAK "ram:µNotes.bak"
  47. #else
  48. #define NOTEFILE "PROGDIR:µNotes.data"
  49. #define NOTEBAK "PROGDIR:µNotes.bak"
  50. #endif
  51.  
  52. #define HELPFILE "PROGDIR:µNote.guide"
  53.  
  54. #define DRUCKER "prt:"
  55. ///
  56. /// var
  57. APTR app;
  58.  
  59. // main-window
  60. APTR wi_main;
  61. Object *strip;
  62. APTR show, sbar;
  63.  
  64. struct ClipboardHandle *clip_handle, *undo_handle;
  65.  
  66. // sonstiges
  67. APTR aboutmui;
  68.  
  69. struct Library *IFFParseBase;
  70. struct Library *TextFieldBase;
  71. struct Library *LocaleBase;
  72. Class *TextFieldClass;
  73. ///
  74.  
  75.  
  76. /// hilfsfunktionen: xget, getstr
  77. LONG xget(Object *obj, ULONG attribute)
  78. {
  79.     LONG x;
  80.     get(obj,attribute,&x);
  81.     return(x);
  82. }
  83. char *getstr(Object *obj)
  84. {
  85.     return((char *)xget(obj,MUIA_String_Contents));
  86. }
  87. ///
  88.  
  89. /// myAbout
  90. VOID myAbout()
  91. {
  92.     MUI_RequestA(app,wi_main,NULL,GetNoteString(msgAboutTitle),GetNoteString(msgAboutButton),
  93.         GetNoteString(msgAbout),NULL);
  94. }
  95. static const struct Hook myAboutHook = { { NULL, NULL }, (VOID *)myAbout,NULL,NULL };
  96. ///
  97. /// myAboutMUI
  98. VOID myAboutMUI()
  99. {
  100.     if (!aboutmui)
  101.     {
  102.         aboutmui = AboutmuiObject,
  103.             MUIA_Window_RefWindow, wi_main,
  104.             MUIA_Aboutmui_Application, app,
  105.         End;
  106.     }
  107.  
  108.     if (aboutmui)
  109.         set(aboutmui,MUIA_Window_Open,TRUE);
  110.     else
  111.         DisplayBeep(0);
  112. }
  113. static const struct Hook myAboutMUIHook = { { NULL, NULL }, (VOID *)myAboutMUI,NULL,NULL };
  114. ///
  115.  
  116. /// myDrucken
  117. VOID myDrucken()
  118. {
  119.     int i,j;
  120.     BPTR fh;
  121.     char ch;
  122.     char *bu;
  123.  
  124.     if (xget(show,TEXTFIELD_Size))
  125.     {
  126.         if ((fh = Open(DRUCKER,MODE_OLDFILE)))
  127.         {
  128.             FPuts(fh,"\n       µNote\n\n       ");
  129.  
  130.             set(show,TEXTFIELD_ReadOnly,TRUE);
  131.             bu = (char *)xget(show,TEXTFIELD_Text);
  132.  
  133.             j = 0;
  134.             for(i=0;i<xget(show,TEXTFIELD_Size);i++)
  135.             {
  136.                 ch = bu[i];
  137.                 if (j++>66)
  138.                 {
  139.                     FPutC(fh,'\n');
  140.                     for (j=0;j<7;j++) FPutC(fh,' ');
  141.                     j = 0;
  142.                 }
  143.                 FPutC(fh,ch);
  144.                 if (ch == '\n')
  145.                 {
  146.                     for (j=0;j<7;j++) FPutC(fh,' ');
  147.                     j = 0;
  148.                 }
  149.             }
  150.             set(show,TEXTFIELD_ReadOnly,FALSE);
  151.  
  152.             Close(fh);
  153.         }
  154.     }
  155. }
  156. static const struct Hook myDruckenHook = { { NULL, NULL }, (VOID *)myDrucken,NULL,NULL };
  157. ///
  158.  
  159. /// laden
  160. void laden()
  161. {
  162.     BPTR fh, lock;
  163.     char *cbuf;
  164.     long len;
  165.     struct FileInfoBlock *fib;
  166.  
  167.     set(show,TEXTFIELD_Text,"");
  168.  
  169.     if ((fib=AllocVec(sizeof(struct FileInfoBlock),MEMF_ANY)))
  170.     {
  171.         if ((lock = Lock(NOTEFILE,ACCESS_READ)))
  172.         {
  173.             Examine(lock,fib);
  174.             len = fib->fib_Size;
  175.             UnLock(lock);
  176.         }
  177.         FreeVec(fib);
  178.     }
  179.  
  180.     fh = Open(NOTEFILE,MODE_OLDFILE);
  181.     if (fh)
  182.     {
  183.         if ((cbuf=AllocVec(len+1,MEMF_ANY)))
  184.         {
  185.  
  186.             Seek(fh,0,OFFSET_BEGINNING);
  187.             Read(fh,cbuf,len);
  188.             cbuf[len] = NULL;
  189.             set(show,TEXTFIELD_Text,cbuf);
  190.             FreeVec(cbuf);
  191.         }
  192.         Close(fh);
  193.     }
  194.     set(show,TEXTFIELD_Modified,FALSE);
  195. }
  196. ///
  197. /// speichern
  198. void speichern()
  199. {
  200.     BPTR fh;
  201.  
  202.     if (xget(show,TEXTFIELD_Modified) == TRUE)
  203.     {
  204.         DeleteFile(NOTEBAK);   // altes .bak löschen
  205.         Rename(NOTEFILE,NOTEBAK); // datenfile zum .bak file machen
  206.         fh = Open(NOTEFILE,MODE_NEWFILE); // neues datenfile kreieren
  207.         if (fh)
  208.         {
  209.             Seek(fh,0,OFFSET_BEGINNING);
  210.             set(show,TEXTFIELD_ReadOnly,TRUE);
  211.             Write(fh, (char *)xget(show,TEXTFIELD_Text), xget(show,TEXTFIELD_Size) );
  212.             set(show,TEXTFIELD_ReadOnly,FALSE);
  213.  
  214.             Close(fh);
  215.         }
  216.         set(show,TEXTFIELD_Modified,FALSE);
  217.     }
  218. }
  219. ///
  220.  
  221. /// setapp
  222. void setapp()
  223. {
  224.     enum { men_about=1, men_amui, men_quit, men_mui, men_prt };
  225.     struct NewMenu my_menu[] =
  226.     {
  227.         { NM_TITLE, "µNote",                          0,  0, 0, 0               },
  228.         { NM_ITEM,  GetNoteString(msgMDrucken),GetNoteString(msgMDruckenSC), 0, 0, (APTR)men_prt   },
  229.         { NM_ITEM,  NM_BARLABEL,                      0,  0, 0, 0               },
  230.         { NM_ITEM,  GetNoteString(msgMAbout),        "?", 0, 0, (APTR)men_about },
  231.         { NM_ITEM,  GetNoteString(msgMAboutM),        0,  0, 0, (APTR)men_amui  },
  232.         { NM_ITEM,  NM_BARLABEL,                      0,  0, 0, 0               },
  233.         { NM_ITEM,  GetNoteString(msgMQuit),         "Q", 0, 0, (APTR)men_quit  },
  234.         { NM_TITLE, GetNoteString(msgMSettings),      0,  0, 0, 0               },
  235.         { NM_ITEM,  GetNoteString(msgMSettingsM),     0,  0, 0, (APTR)men_mui   },
  236.         { NM_END,NULL,0,0,0,0 }
  237.     };
  238.  
  239.     app = ApplicationObject,
  240.         MUIA_Application_Title, "µNote",
  241.         MUIA_Application_Version, "$VER: µNote 1.1 (27.12.96)",
  242.         MUIA_Application_Copyright, "e-mailware",
  243.         MUIA_Application_Author, "Daniel Hirscher",
  244.         MUIA_Application_Description, GetNoteString(msgAppDesc),
  245.         MUIA_Application_Base, "MNOTE",
  246.         MUIA_Application_HelpFile, HELPFILE,
  247.  
  248.         SubWindow, wi_main = WindowObject,
  249.             MUIA_Window_ID, MAKE_ID('M','A','I','N'),
  250.             MUIA_Window_Title, "µNote",
  251.             MUIA_Window_Menustrip, strip = MUI_MakeObject(MUIO_MenustripNM,my_menu,0),
  252.             WindowContents, VGroup,
  253.                 Child, HGroup,
  254.                     MUIA_Group_HorizSpacing, 0,
  255.                     Child, show = BoopsiObject,
  256.                         InputListFrame,
  257.                         MUIA_Boopsi_Class, TextFieldClass,
  258.                         MUIA_Boopsi_Smart, TRUE,
  259.                         MUIA_Boopsi_MinWidth, 250,
  260.                         MUIA_Boopsi_MinHeight, 100,
  261.                         ICA_TARGET, ICTARGET_IDCMP,
  262.                         TEXTFIELD_BlockCursor, TRUE,
  263.                         TEXTFIELD_Partial, TRUE,
  264.                         TEXTFIELD_ClipStream, clip_handle,
  265.                         TEXTFIELD_UndoStream, undo_handle,
  266.                         GA_TabCycle, TRUE,
  267.                         MUIA_CycleChain, TRUE,
  268.                     End,
  269.                     Child, sbar = ScrollbarObject,
  270.                         MUIA_CycleChain, TRUE,
  271.                         MUIA_ShortHelp, GetNoteString(msgSchieber),
  272.                     End,
  273.                 End,
  274.             End,
  275.         End,
  276.  
  277.     End;
  278. }
  279. ///
  280. /// setmethods
  281. void setmethods()
  282. {
  283. // Notification
  284.     // menu
  285.     DoMethod((Object *)DoMethod(strip,MUIM_FindUData,men_quit),
  286.         MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,
  287.         app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  288.     DoMethod((Object *)DoMethod(strip,MUIM_FindUData,men_about),
  289.         MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,
  290.         app,2,MUIM_CallHook,&myAboutHook);
  291.     DoMethod((Object *)DoMethod(strip,MUIM_FindUData,men_mui),
  292.         MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,
  293.         app,2,MUIM_Application_OpenConfigWindow,NULL);
  294.     DoMethod((Object *)DoMethod(strip,MUIM_FindUData,men_amui),
  295.         MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,
  296.         app,2,MUIM_CallHook,&myAboutMUIHook);
  297.     DoMethod((Object *)DoMethod(strip,MUIM_FindUData,men_prt),
  298.         MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,
  299.         app,2,MUIM_CallHook,&myDruckenHook);
  300.  
  301.  
  302.     // main-window
  303.     DoMethod(show,MUIM_Notify,TEXTFIELD_Lines,MUIV_EveryTime,
  304.         sbar,3,MUIM_Set,MUIA_Prop_Entries,MUIV_TriggerValue);
  305.     DoMethod(show,MUIM_Notify,TEXTFIELD_Visible,MUIV_EveryTime,
  306.         sbar,3,MUIM_Set,MUIA_Prop_Visible,MUIV_TriggerValue);
  307.     DoMethod(show,MUIM_Notify,TEXTFIELD_Top,MUIV_EveryTime,
  308.         sbar,3,MUIM_NoNotifySet,MUIA_Prop_First,MUIV_TriggerValue);
  309.     DoMethod(sbar,MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,
  310.         show,3,MUIM_NoNotifySet,TEXTFIELD_Top,MUIV_TriggerValue);
  311. }
  312. ///
  313. /// setup
  314. BOOL setup()
  315. {
  316.     laden();
  317.     return(TRUE);
  318. }
  319. ///
  320. /// setdown
  321. void setdown()
  322. {
  323.     if (undo_handle) CloseClipboard(undo_handle);
  324.     if (clip_handle) CloseClipboard(clip_handle);
  325.  
  326.     speichern();
  327.     if (TextFieldBase) CloseLibrary(TextFieldBase);
  328.     if (IFFParseBase) CloseLibrary(IFFParseBase);
  329.  
  330.     CloseNoteCatalog();
  331.     CloseLibrary(LocaleBase);
  332. }
  333. ///
  334. /// openlib
  335. void openlib()
  336. {
  337.     LocaleBase = OpenLibrary("locale.library",38);
  338.     OpenNoteCatalog(NULL,NULL);
  339.  
  340.     if (!(IFFParseBase = OpenLibrary("iffparse.library",0)))
  341.         fail(NULL,"iffparse.library not available\n");
  342.     clip_handle = OpenClipboard(0);
  343.     undo_handle = OpenClipboard(42);
  344.  
  345.     if (!(TextFieldBase = OpenLibrary("gadgets/textfield.gadget",0)))
  346.         fail(NULL,"textfield boopsi gadget not available\n");
  347.     TextFieldClass = TEXTFIELD_GetClass();
  348. }
  349. ///
  350. /// main
  351. int main(int argc, char *argv[])
  352. {
  353.     init();
  354.  
  355.     openlib();
  356.  
  357.     setapp();
  358.  
  359.     if (!app)
  360.         fail(app,"Failed to create Application.");
  361.  
  362.     setmethods();
  363.  
  364.     // ideal input-loop - DO NEVER CHANGE
  365.     DoMethod(wi_main,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,
  366.             app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  367.  
  368.     if (!setup())
  369.         fail(app,"Failed to set up.");
  370.  
  371.     set(wi_main,MUIA_Window_Open,TRUE);
  372.     {
  373.         ULONG sigs = 0;
  374.         while (DoMethod(app,MUIM_Application_NewInput,&sigs) != MUIV_Application_ReturnID_Quit)
  375.         { if (sigs) { sigs = Wait(sigs | SIGBREAKF_CTRL_C); if (sigs & SIGBREAKF_CTRL_C) break; } }
  376.     }
  377.     set(wi_main,MUIA_Window_Open,FALSE);
  378.  
  379.     setdown();
  380.  
  381.     fail(app,NULL);
  382. }
  383. ///
  384.  
  385. // end
  386.